'''封装
将属性和⽅法书写到类的⾥⾯的操作即为封装
封装可以为属性和⽅法添加私有权限
继承
⼦类默认继承⽗类的所有属性和⽅法
⼦类可以重写⽗类属性和⽅法
多态
传⼊不同的对象，产⽣不同的结果'''


# 多态：传入不同的参数，产生不同的结果
# class Dog():
#     pass
# class zhui(Dog):
#     def work(self):
#         print('追杀')
# class sou(Dog):
#     def work(self):
#         print('搜索')
# class ren():
#     def work_ren(self,Dog):
#         Dog.work()
# ad = zhui()
# ac = sou()
# ming = ren()
# ming.work_ren(ad)
# ming.work_ren(ac)


# 类属性和实例属性

# 类属性{简单来说就是calss下方定义的，不加init的属性就是类属性}
# 类属性就是 类对象所拥有的属性，它被该类的所有实例对象所共有。
# 类属性可以使⽤类对象或实例对象访问

# 类属性的优点
# 记录的某项数据 始终保持⼀致时，则定义类属性。
# 实例属性要求每个对象为其单独开辟⼀份内存空间来记录数据，⽽类属性为全类所共有，仅占⽤⼀份内存，更加节省内存空间
# class Dog():
#     tooth = 10#设置类属性
# wangcai = Dog()
# print(Dog.tooth) # 10，类属性调用
# print(wangcai.tooth) # 10，实例属性调用

# 修改类属性：类属性只能通过类对象修改，不能通过实例对象修改，如果通过实例对象修改类属性，表示的是创建了⼀个实例属性
# Dog.tooth = 20#修改类属性
# print(Dog.tooth)
# wangcai.tooth = 30#实例属性修改类属性，创建新的实例属性
# print(wangcai.tooth)
# print(Dog.tooth)

# 实例属性：简单说就是所有的init中的属性就是实例属性。不能被类调用访问


# 类方法
# 需要⽤装饰器 @classmethod来标识其为类⽅法，对于类⽅法，第⼀个参数必须是类对象，⼀般以cls 作为第⼀个参数
# 使用场景：一般配合类属性使用
# class Dog():
#     tooth = 10#设置类属性
#     @classmethod
#     def get_tooth(cls):
#         print(f'{cls.tooth}')
# wangcai = Dog()
# print(Dog.tooth) # 10，类属性调用
# print(wangcai.tooth) # 10，实例属性调用
# wangcai.get_tooth() #10
# Dog.get_tooth()

# 静态方法：需要通过装饰器 @staticmethod 来进⾏修饰，静态⽅法既不需要传递类对象也不需要传递实例对象（形参没有self/cls）
# 使用场景：
# class Dog():
#     @staticmethod
#     def info_print():
#         print('⽤于创建狗实例')
# wangcai = Dog()
# # 静态⽅法既可以使⽤对象访问⼜可以使⽤类访问
# wangcai.info_print()
# Dog.info_print()


